// Set 数据结构
// 对象是值的集合，你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次，即 Set 中的元素是唯一的。
// set{[value:value]}:set集合的key:value一致
// 1.Set.proptotype.add() :在set对象尾部添加一个元素。返回set对象
const newSet = new Set();
// set支持链式调用
newSet.add(1).add(2).add(3);
newSet.add(100)

console.log(newSet); //Set(3) { 1, 2, 3,100 }

// 2.Set.prototype.forEach():根据集合中元素的插入顺序，依次执行提供的回调函数

newSet.forEach(i => console.log(i))
    // <=>对象遍历
for (let i of newSet) {
    console.log(i);
}
// function setFn(value1, value2, set) {
//     console.log('i', value1, value2);
// }
// newSet.forEach(setFn)

// 3.Set.prototype.has(value): 返回一个布尔值，表示该值在Set中存在与否
console.log(newSet.has(1)); // true 查询set对象是否存在

// 4. Set.prototype.delete(value):移除Set中与这个值相等的元素，返回Set.prototype.has(value)在这个操作前会返回的值（即如果该元素存在，返回true，否则返回false）。Set.prototype.has(value)在此后会返回false。
// 查询是否存在，true则删除
console.log(newSet.delete(1)); //true
console.log(newSet.delete(102)); //false
console.log(newSet); //Set(3) { 2, 3, 100 }


// 5. Set.prototype.clear():移除Set对象内的所有元素
newSet.clear()
console.log(newSet); //Set(0) {}

// 6.Set.prototype.values():返回一个新的迭代器对象，该对象包含Set对象中的按插入顺序排列的所有元素的值。
const setA = new Set([1, 2, 3, 5, 6, 7, 8]);
console.log('values', setA.values()); //{ 1, 2, 3, 5, 6, 7, 8 }
console.log('keys', setA.keys()); // { 1, 2, 3, 5, 6, 7, 8 }
// 7.Set.prototype.size:返回一个对象的长度
console.log(setA.size); //7

// 8.常见使用场景：数组去重
const arr = [1, 2, 3, 5, 5, 1, 2, 0]

const newArrSet = new Set(arr)
console.log(newArrSet); //Set(5) { 1, 2, 3, 5, 0 }
console.log(Array.from(newArrSet)); //[ 1, 2, 3, 5, 0 ]